<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Multi-match query | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="full-text-queries.html" title="Full text queries">
<link rel="prev" href="query-dsl-match-query-phrase-prefix.html" title="Match phrase prefix query">
<link rel="next" href="query-dsl-common-terms-query.html" title="Common Terms Query">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">Query DSL</a></span>
»
<span class="breadcrumb-link"><a href="full-text-queries.html">Full text queries</a></span>
»
<span class="breadcrumb-node">Multi-match query</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl-match-query-phrase-prefix.html">« Match phrase prefix query</a>
</span>
<span class="next">
<a href="query-dsl-common-terms-query.html">Common Terms Query »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-dsl-multi-match-query"></a>Multi-match query<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h2>
</div></div></div>

<p>The <code class="literal">multi_match</code> query builds on the <a class="xref" href="query-dsl-match-query.html" title="Match query"><code class="literal">match</code> query</a>
to allow multi-field queries:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", <a id="CO42-1"></a><i class="conum" data-value="1"></i>
      "fields": [ "subject", "message" ] <a id="CO42-2"></a><i class="conum" data-value="2"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/127.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO42-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The query string.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO42-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The fields to be queried.</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="field-boost"></a><code class="literal">fields</code> and per-field boosting<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h4>
<p>Fields can be specified with wildcards, eg:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] <a id="CO43-1"></a><i class="conum" data-value="1"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/128.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO43-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Query the <code class="literal">title</code>, <code class="literal">first_name</code> and <code class="literal">last_name</code> fields.</p>
</td>
</tr>
</table>
</div>
<p>Individual fields can be boosted with the caret (<code class="literal">^</code>) notation:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] <a id="CO44-1"></a><i class="conum" data-value="1"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/129.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO44-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">subject</code> field is three times as important as the <code class="literal">message</code> field.</p>
</td>
</tr>
</table>
</div>
<p>If no <code class="literal">fields</code> are provided, the <code class="literal">multi_match</code> query defaults to the <code class="literal">index.query.default_field</code>
index settings, which in turn defaults to <code class="literal">*</code>. <code class="literal">*</code> extracts all fields in the mapping that
are eligible to term queries and filters the metadata fields. All extracted fields are then
combined to build a query.</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>There is a limit on the number of fields that can be queried
at once. It is defined by the <code class="literal">indices.query.bool.max_clause_count</code> <a class="xref" href="search-settings.html" title="Search settings">Search settings</a>
which defaults to 1024.</p>
</div>
</div>
<h4>
<a id="multi-match-types"></a>Types of <code class="literal">multi_match</code> query:<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h4>
<p>The way the <code class="literal">multi_match</code> query is executed internally depends on the <code class="literal">type</code>
parameter, which can be set to:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">best_fields</code>
</p>
</td>
<td valign="top">
<p>
(<span class="strong strong"><strong>default</strong></span>) Finds documents which match any field, but
uses the  <code class="literal">_score</code> from the best field.  See <a class="xref" href="query-dsl-multi-match-query.html#type-best-fields" title="best_fields"><code class="literal">best_fields</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">most_fields</code>
</p>
</td>
<td valign="top">
<p>
Finds documents which match any field and combines
the <code class="literal">_score</code> from each field.  See <a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">cross_fields</code>
</p>
</td>
<td valign="top">
<p>
Treats fields with the same <code class="literal">analyzer</code> as though they
were one big field. Looks for each word in <span class="strong strong"><strong>any</strong></span>
field. See <a class="xref" href="query-dsl-multi-match-query.html#type-cross-fields" title="cross_fields"><code class="literal">cross_fields</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">phrase</code>
</p>
</td>
<td valign="top">
<p>
Runs a <code class="literal">match_phrase</code> query on each field and uses the <code class="literal">_score</code>
from the best field.  See <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> and <code class="literal">phrase_prefix</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">phrase_prefix</code>
</p>
</td>
<td valign="top">
<p>
Runs a <code class="literal">match_phrase_prefix</code> query on each field and uses
the <code class="literal">_score</code> from the best field.  See <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> and <code class="literal">phrase_prefix</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">bool_prefix</code>
</p>
</td>
<td valign="top">
<p>
Creates a <code class="literal">match_bool_prefix</code> query on each field and
combines the <code class="literal">_score</code> from each field. See
<a class="xref" href="query-dsl-multi-match-query.html#type-bool-prefix" title="bool_prefix"><code class="literal">bool_prefix</code></a>.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-best-fields"></a><code class="literal">best_fields</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">best_fields</code> type is most useful when you are searching for multiple
words best found in the same field. For instance “brown fox” in a single
field is more meaningful than “brown” in one field and “fox” in the other.</p>
<p>The <code class="literal">best_fields</code> type generates a <a class="xref" href="query-dsl-match-query.html" title="Match query"><code class="literal">match</code> query</a> for
each field and wraps them in a <a class="xref" href="query-dsl-dis-max-query.html" title="Disjunction max query"><code class="literal">dis_max</code></a> query, to
find the single best matching field.  For instance, this query:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "brown fox",
      "type":       "best_fields",
      "fields":     [ "subject", "message" ],
      "tie_breaker": 0.3
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/130.console"></div>
<p>would be executed as:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        { "match": { "subject": "brown fox" }},
        { "match": { "message": "brown fox" }}
      ],
      "tie_breaker": 0.3
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/131.console"></div>
<p>Normally the <code class="literal">best_fields</code> type uses the score of the <span class="strong strong"><strong>single</strong></span> best matching
field, but if <code class="literal">tie_breaker</code> is specified, then it calculates the score as
follows:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
the score from the best matching field
</li>
<li class="listitem">
plus <code class="literal">tie_breaker * _score</code> for all other matching fields
</li>
</ul>
</div>
<p>Also, accepts <code class="literal">analyzer</code>, <code class="literal">boost</code>, <code class="literal">operator</code>, <code class="literal">minimum_should_match</code>,
<code class="literal">fuzziness</code>, <code class="literal">lenient</code>, <code class="literal">prefix_length</code>, <code class="literal">max_expansions</code>, <code class="literal">rewrite</code>, <code class="literal">zero_terms_query</code>,
 <code class="literal">cutoff_frequency</code>, <code class="literal">auto_generate_synonyms_phrase_query</code> and <code class="literal">fuzzy_transpositions</code>,
  as explained in <a class="xref" href="query-dsl-match-query.html" title="Match query">match query</a>.</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<h3>
<code class="literal">operator</code> and <code class="literal">minimum_should_match</code><a id="operator-min"></a>
</h3>
<p>The <code class="literal">best_fields</code> and <code class="literal">most_fields</code> types are <em>field-centric</em> — they generate
a <code class="literal">match</code> query <span class="strong strong"><strong>per field</strong></span>.  This means that the <code class="literal">operator</code> and
<code class="literal">minimum_should_match</code> parameters are applied to each field individually,
which is probably not what you want.</p>
<p>Take this query for example:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "best_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and" <a id="CO45-1"></a><i class="conum" data-value="1"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/132.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO45-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>All terms must be present.</p>
</td>
</tr>
</table>
</div>
<p>This query is executed as:</p>
<pre class="literallayout">  (+first_name:will +first_name:smith)
| (+last_name:will  +last_name:smith)</pre>

<p>In other words, <span class="strong strong"><strong>all terms</strong></span> must be present <span class="strong strong"><strong>in a single field</strong></span> for a document
to match.</p>
<p>See <a class="xref" href="query-dsl-multi-match-query.html#type-cross-fields" title="cross_fields"><code class="literal">cross_fields</code></a> for a better solution.</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-most-fields"></a><code class="literal">most_fields</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">most_fields</code> type is most useful when querying multiple fields that
contain the same text analyzed in different ways.  For instance, the main
field may contain synonyms, stemming and terms without diacritics. A second
field may contain the original terms, and a third field might contain
shingles. By combining scores from all three fields we can match as many
documents as possible with the main field, but use the second and third fields
to push the most similar results to the top of the list.</p>
<p>This query:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown fox",
      "type":       "most_fields",
      "fields":     [ "title", "title.original", "title.shingles" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/133.console"></div>
<p>would be executed as:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":          "quick brown fox" }},
        { "match": { "title.original": "quick brown fox" }},
        { "match": { "title.shingles": "quick brown fox" }}
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/134.console"></div>
<p>The score from each <code class="literal">match</code> clause is added together, then divided by the
number of <code class="literal">match</code> clauses.</p>
<p>Also, accepts <code class="literal">analyzer</code>, <code class="literal">boost</code>, <code class="literal">operator</code>, <code class="literal">minimum_should_match</code>,
<code class="literal">fuzziness</code>, <code class="literal">lenient</code>, <code class="literal">prefix_length</code>, <code class="literal">max_expansions</code>, <code class="literal">rewrite</code>, <code class="literal">zero_terms_query</code>
and <code class="literal">cutoff_frequency</code>, as explained in <a class="xref" href="query-dsl-match-query.html" title="Match query">match query</a>, but
<span class="strong strong"><strong>see <a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match"><code class="literal">operator</code> and <code class="literal">minimum_should_match</code></a></strong></span>.</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-phrase"></a><code class="literal">phrase</code> and <code class="literal">phrase_prefix</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">phrase</code> and <code class="literal">phrase_prefix</code> types behave just like <a class="xref" href="query-dsl-multi-match-query.html#type-best-fields" title="best_fields"><code class="literal">best_fields</code></a>,
but they use a <code class="literal">match_phrase</code> or <code class="literal">match_phrase_prefix</code> query instead of a
<code class="literal">match</code> query.</p>
<p>This query:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown f",
      "type":       "phrase_prefix",
      "fields":     [ "subject", "message" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/135.console"></div>
<p>would be executed as:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        { "match_phrase_prefix": { "subject": "quick brown f" }},
        { "match_phrase_prefix": { "message": "quick brown f" }}
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/136.console"></div>
<p>Also, accepts <code class="literal">analyzer</code>, <a class="xref" href="mapping-boost.html" title="boost"><code class="literal">boost</code></a>, <code class="literal">lenient</code> and <code class="literal">zero_terms_query</code> as explained
in <a class="xref" href="query-dsl-match-query.html" title="Match query">Match</a>, as well as <code class="literal">slop</code> which is explained in <a class="xref" href="query-dsl-match-query-phrase.html" title="Match phrase query">Match phrase</a>.
Type <code class="literal">phrase_prefix</code> additionally accepts <code class="literal">max_expansions</code>.</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<h3>
<code class="literal">phrase</code>, <code class="literal">phrase_prefix</code> and <code class="literal">fuzziness</code><a id="phrase-fuzziness"></a>
</h3>
<p>The <code class="literal">fuzziness</code> parameter cannot be used with the <code class="literal">phrase</code> or <code class="literal">phrase_prefix</code> type.</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-cross-fields"></a><code class="literal">cross_fields</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">cross_fields</code> type is particularly useful with structured documents where
multiple fields <span class="strong strong"><strong>should</strong></span> match.  For instance, when querying the <code class="literal">first_name</code>
and <code class="literal">last_name</code> fields for “Will Smith”, the best match is likely to have
“Will” in one field and “Smith” in the other.</p>
<div class="sidebar">
<div class="titlepage"></div>
<p>This sounds like a job for <a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a> but there are two problems
with that approach. The first problem is that <code class="literal">operator</code> and
<code class="literal">minimum_should_match</code> are applied per-field, instead of per-term (see
<a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match">explanation above</a>).</p>
<p>The second problem is to do with relevance: the different term frequencies in
the <code class="literal">first_name</code> and <code class="literal">last_name</code> fields   can produce unexpected results.</p>
<p>For instance, imagine we have two people: “Will Smith” and “Smith Jones”.
“Smith” as a last name is very common (and so is of low importance) but
“Smith” as a first name is very uncommon (and so is of great importance).</p>
<p>If we do a search for “Will Smith”, the “Smith Jones” document will
probably appear above the better matching “Will Smith” because the score of
<code class="literal">first_name:smith</code> has trumped the combined scores of <code class="literal">first_name:will</code> plus
<code class="literal">last_name:smith</code>.</p>
</div>
<p>One way of dealing with these types of queries is simply to index the
<code class="literal">first_name</code> and <code class="literal">last_name</code> fields into a single <code class="literal">full_name</code> field.  Of
course, this can only be done at index time.</p>
<p>The <code class="literal">cross_field</code> type tries to solve these problems at query time by taking a
<em>term-centric</em> approach.  It first analyzes the query string into individual
terms, then looks for each term in any of the fields, as though they were one
big field.</p>
<p>A query like:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "cross_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/137.console"></div>
<p>is executed as:</p>
<pre class="literallayout">+(first_name:will  last_name:will)
+(first_name:smith last_name:smith)</pre>

<p>In other words, <span class="strong strong"><strong>all terms</strong></span> must be present <span class="strong strong"><strong>in at least one field</strong></span> for a
document to match.  (Compare this to
<a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match">the logic used for <code class="literal">best_fields</code> and <code class="literal">most_fields</code></a>.)</p>
<p>That solves one of the two problems. The problem of differing term frequencies
is solved by <em>blending</em> the term frequencies for all fields in order to even
out the differences.</p>
<p>In practice, <code class="literal">first_name:smith</code> will be treated as though it has the same
frequencies as <code class="literal">last_name:smith</code>, plus one. This will make matches on
<code class="literal">first_name</code> and <code class="literal">last_name</code> have comparable scores, with a tiny advantage
for <code class="literal">last_name</code> since it is the most likely field that contains <code class="literal">smith</code>.</p>
<p>Note that <code class="literal">cross_fields</code> is usually only useful on short string fields
that all have a <code class="literal">boost</code> of <code class="literal">1</code>. Otherwise boosts, term freqs and length
normalization contribute to the score in such a way that the blending of term
statistics is not meaningful anymore.</p>
<p>If you run the above query through the <a class="xref" href="search-validate.html" title="Validate API">Validate API</a>, it returns this
explanation:</p>
<pre class="literallayout">+blended("will",  fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])</pre>

<p>Also, accepts <code class="literal">analyzer</code>, <code class="literal">boost</code>, <code class="literal">operator</code>, <code class="literal">minimum_should_match</code>,
<code class="literal">lenient</code>, <code class="literal">zero_terms_query</code> and <code class="literal">cutoff_frequency</code>, as explained in
<a class="xref" href="query-dsl-match-query.html" title="Match query">match query</a>.</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="cross-field-analysis"></a><code class="literal">cross_field</code> and analysis<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h4>
</div></div></div>
<p>The <code class="literal">cross_field</code> type can only work in term-centric mode on fields that have
the same analyzer. Fields with the same analyzer are grouped together as in
the example above.  If there are multiple groups, they are combined with a
<code class="literal">bool</code> query.</p>
<p>For instance, if we have a <code class="literal">first</code> and <code class="literal">last</code> field which have
the same analyzer, plus a <code class="literal">first.edge</code> and <code class="literal">last.edge</code> which
both use an <code class="literal">edge_ngram</code> analyzer, this query:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Jon",
      "type":       "cross_fields",
      "fields":     [
        "first", "first.edge",
        "last",  "last.edge"
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/138.console"></div>
<p>would be executed as:</p>
<pre class="literallayout">    blended("jon", fields: [first, last])
| (
    blended("j",   fields: [first.edge, last.edge])
    blended("jo",  fields: [first.edge, last.edge])
    blended("jon", fields: [first.edge, last.edge])
)</pre>

<p>In other words, <code class="literal">first</code> and <code class="literal">last</code> would be grouped together and
treated as a single field, and <code class="literal">first.edge</code> and <code class="literal">last.edge</code> would be
grouped together and treated as a single field.</p>
<p>Having multiple groups is fine, but when combined with <code class="literal">operator</code> or
<code class="literal">minimum_should_match</code>, it can suffer from the <a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match">same problem</a>
as <code class="literal">most_fields</code> or <code class="literal">best_fields</code>.</p>
<p>You can easily rewrite this query yourself as two separate <code class="literal">cross_fields</code>
queries combined with a <code class="literal">bool</code> query, and apply the <code class="literal">minimum_should_match</code>
parameter to just one of them:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match" : {
            "query":      "Will Smith",
            "type":       "cross_fields",
            "fields":     [ "first", "last" ],
            "minimum_should_match": "50%" <a id="CO46-1"></a><i class="conum" data-value="1"></i>
          }
        },
        {
          "multi_match" : {
            "query":      "Will Smith",
            "type":       "cross_fields",
            "fields":     [ "*.edge" ]
          }
        }
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/139.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO46-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Either <code class="literal">will</code> or <code class="literal">smith</code> must be present in either of the <code class="literal">first</code>
or <code class="literal">last</code> fields</p>
</td>
</tr>
</table>
</div>
<p>You can force all fields into the same group by specifying the <code class="literal">analyzer</code>
parameter in the query.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
   "multi_match" : {
      "query":      "Jon",
      "type":       "cross_fields",
      "analyzer":   "standard", <a id="CO47-1"></a><i class="conum" data-value="1"></i>
      "fields":     [ "first", "last", "*.edge" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/140.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO47-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Use the <code class="literal">standard</code> analyzer for all fields.</p>
</td>
</tr>
</table>
</div>
<p>which will be executed as:</p>
<pre class="literallayout">blended("will",  fields: [first, first.edge, last.edge, last])
blended("smith", fields: [first, first.edge, last.edge, last])</pre>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="tie-breaker"></a><code class="literal">tie_breaker</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h4>
</div></div></div>
<p>By default, each per-term <code class="literal">blended</code> query will use the best score returned by
any field in a group, then these scores are added together to give the final
score. The <code class="literal">tie_breaker</code> parameter can change the default behaviour of the
per-term <code class="literal">blended</code> queries. It accepts:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">0.0</code>
</p>
</td>
<td valign="top">
<p>
Take the single best score out of (eg) <code class="literal">first_name:will</code>
and <code class="literal">last_name:will</code> (<span class="strong strong"><strong>default</strong></span>)
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">1.0</code>
</p>
</td>
<td valign="top">
<p>
Add together the scores for (eg) <code class="literal">first_name:will</code> and
<code class="literal">last_name:will</code>
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">0.0 &lt; n &lt; 1.0</code>
</p>
</td>
<td valign="top">
<p>
Take the single best score plus <code class="literal">tie_breaker</code> multiplied
by each of the scores from other matching fields.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<h3>
<code class="literal">cross_fields</code> and <code class="literal">fuzziness</code><a id="crossfields-fuzziness"></a>
</h3>
<p>The <code class="literal">fuzziness</code> parameter cannot be used with the <code class="literal">cross_fields</code> type.</p>
</div>
</div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-bool-prefix"></a><code class="literal">bool_prefix</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/multi-match-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">bool_prefix</code> type’s scoring behaves like <a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a>, but using a
<a class="xref" href="query-dsl-match-bool-prefix-query.html" title="Match boolean prefix query"><code class="literal">match_bool_prefix</code> query</a> instead of a
<code class="literal">match</code> query.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown f",
      "type":       "bool_prefix",
      "fields":     [ "subject", "message" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/141.console"></div>
<p>The <code class="literal">analyzer</code>, <code class="literal">boost</code>, <code class="literal">operator</code>, <code class="literal">minimum_should_match</code>, <code class="literal">lenient</code>,
<code class="literal">zero_terms_query</code>, and <code class="literal">auto_generate_synonyms_phrase_query</code> parameters as
explained in <a class="xref" href="query-dsl-match-query.html" title="Match query">match query</a> are supported. The
<code class="literal">fuzziness</code>, <code class="literal">prefix_length</code>, <code class="literal">max_expansions</code>, <code class="literal">rewrite</code>, and
<code class="literal">fuzzy_transpositions</code> parameters are supported for the terms that are used to
construct term queries, but do not have an effect on the prefix query
constructed from the final term.</p>
<p>The <code class="literal">slop</code> and <code class="literal">cutoff_frequency</code> parameters are not supported by this query
type.</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl-match-query-phrase-prefix.html">« Match phrase prefix query</a>
</span>
<span class="next">
<a href="query-dsl-common-terms-query.html">Common Terms Query »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
